package com.candoit.webapps.pricing.controllers;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import com.candoit.webapps.pricing.model.Articulo;
import com.candoit.webapps.pricing.model.Formato;
import com.candoit.webapps.pricing.model.Medida;
import com.candoit.webapps.pricing.util.FormatoUtil;
import com.candoit.webapps.pricing.util.QueryUtil;

@ManagedBean(name = "formatoCtrl")
@ViewScoped
public class FormatoController extends AbstractController{
	
	private List<FormatoUtil> formatos;
	
	private Formato formatoSelected;
	
	private Integer ancho = 0;
	
	private Integer alto = 0;
	
	private Integer largo = 0;
	
	public List<FormatoUtil> getFormatos() {
		List<Formato> formatoList = QueryUtil.getInstance().getFormatos();
		this.fillFormatos(formatoList);
		return formatos;
	}

	public void setFormatos(List<FormatoUtil> formatos) {
		this.formatos = formatos;
	}

	public Formato getFormatoSelected() {
		if (formatoSelected == null){
			formatoSelected = new Formato();
		}
		return formatoSelected;
	}

	public void setFormatoSelected(Formato formatoSelected) {
		this.formatoSelected = formatoSelected;
	}

	public void saveFormato(){
		Iterator<FormatoUtil> it = formatos.iterator();
		while (it.hasNext()){
			   FormatoUtil util = (FormatoUtil) it.next();
				   if (util.getFormato().getId() == null || util.getFormato().getId() == 0){
					   if (ancho !=  0 && alto != 0 && largo != 0){
					   		Medida medida = QueryUtil.getInstance().getMedidaFilter(ancho, largo, alto); 
					   		if (medida == null){
					   			medida = new Medida();
					   			medida.setActivo(true);
					   			medida.setAlto(alto);
					   			medida.setAncho(ancho);
					   			medida.setLargo(largo);
					   			this.save(medida);
					   			this.alto = 0;
					   			this.ancho = 0;
					   			this.largo = 0;
					   		}else{
					   			Formato formato = QueryUtil.getInstance().getFormatoByMedidaAndLinea(medida, util.getFormato().getLinea());
					   			if (formato != null){
					   				FacesContext.getCurrentInstance().addMessage("abmformatoform:botonguardar", new FacesMessage("Ya existe el formato: " + util.getFormato().getLinea().getNombre() + "/" + medida.getDescripcionMsg()));
					   				this.saveSuccess = false;
					   				return;
					   			}
					   		}
					   		util.getFormato().setMedida(medida);
					   		util.getFormato().setRentabilidad(0.00d);
						   	this.save(util.getFormato());
					   }		
				   }else{
					   this.update(util.getFormato());
				   }
			}
	}
	
	public void removeFormato(){
		Iterator<FormatoUtil> it = formatos.iterator();
		while (it.hasNext()){
			   FormatoUtil util = (FormatoUtil) it.next();
			   if (util.isSelected()){
				   if (util.getFormato().getId() != null && util.getFormato().getId() != 0){
					   List<Articulo> articulos = QueryUtil.getInstance().getArticulosByFormato(util.getFormato());
					   for (Articulo articulo : articulos){
						    articulo.setFormato(null);
						    this.update(articulo);
					   }
					   this.remove(util.getFormato());
				   }
			   }
		}
	}
	
	public void clearData(){
		this.saveSuccess = false;
		this.deleteSuccess = false;
		this.formatoSelected = null;
	}
	
	private void fillFormatos(List<Formato> list){
		formatos = new ArrayList<FormatoUtil>();
		Iterator<Formato> it = list.iterator();
		while (it.hasNext()){
			   Formato formato = (Formato) it.next();
			   FormatoUtil util = new FormatoUtil();
			   util.setFormato(formato);
			   util.setSelected(false);
			   formatos.add(util);
		}
		
		FormatoUtil utilFormato = new FormatoUtil();
		Formato format = new Formato();
		format.setActivo(true);
		utilFormato.setFormato(format);
		utilFormato.setSelected(false);
		formatos.add(utilFormato);
	}

	public Integer getAncho() {
		return ancho;
	}

	public void setAncho(Integer ancho) {
		this.ancho = ancho;
	}

	public Integer getAlto() {
		return alto;
	}

	public void setAlto(Integer alto) {
		this.alto = alto;
	}

	public Integer getLargo() {
		return largo;
	}

	public void setLargo(Integer largo) {
		this.largo = largo;
	}
	
	

}
